﻿using PmSadis.Repositories.Abstract;
using PmSadis.Models;
using System.Linq;
using PmSadis.Dal;
using System;
using System.Data.Entity;
using System.Collections.Generic;

namespace PmSadis.Repositories
{
    /// <summary>
    /// Хранилище объектов контрактов
    /// </summary>
    public class ObjectInContractRepository : IListRepository<ObjectInContract>
    {
        private ModelsContext _context = new ModelsContext();

        /// <summary>
        /// Полный список объектов контрактов
        /// </summary>
        public IQueryable<ObjectInContract> All
        {
            get
            {
                return _context.ObjectsInContracts.OrderByDescending(x => x.DateCreate);
            }
        }

        /// <summary>
        /// Удалить объект
        /// </summary>
        /// <param name="id">Идентификатор объекта</param>
        public void Delete(object id)
        {
            var objectId = (int)id;
            var @object = _context.ObjectsInContracts.FirstOrDefault(x => x.ObjectId == objectId);
            if (@object == null) return;

            _context.ObjectsInContracts.Remove(@object);
            _context.SaveChanges();
        }

        /// <summary>
        /// Создать или редактировать объект
        /// </summary>
        /// <param name="@object">Объект</param>
        public object Edit(ObjectInContract @object)
        {
            var dateNow = DateTime.Now;
            if (@object.ObjectInContractId == 0)
            {
                @object.DateCreate = dateNow;
                @object.DateUpdate = dateNow;
                _context.Entry(@object).State = EntityState.Added;
            }
            else
            {
                @object.DateUpdate = dateNow;
                _context.Entry(@object).State = EntityState.Modified;
            }
            
            _context.SaveChanges();

            return @object.ObjectInContractId;
        }

        /// <summary>
        /// Отвязать объект от контракта
        /// </summary>
        /// <param name="objectId">Идентификатор объекта контракта</param>
        public void UnlinkObject(int objectId)
        {
            var o = _context.ObjectsInContracts.FirstOrDefault(x => x.ObjectInContractId == objectId);
            o.MonthBegin = null;
            o.MonthEnd = null;
            o.SubContractId = null;
            Edit(o);
        }

        /// <summary>
        /// Привязать объекты к контракту
        /// </summary>
        /// <param name="objectsId">Идентификаторы привязывемых объектов</param>
        /// <param name="subContractId">Идентификатор субконтракта</param>
        public void LinkObjects(List<int> objectsId, int subContractId)
        {
            var objects = _context.ObjectsInContracts.Where(x => objectsId.Contains(x.ObjectInContractId)).ToList();
            objects.ForEach(x =>
            {
                x.SubContractId = subContractId;
                Edit(x);
            });
        }
    }
}
